#include "mainwindow.h"
#include "ui_mainwindow.h"

//这里我们来理解一下信号槽和事件
//信号槽
//用户进行的各种操作，就可能会产生出信号.可以给某个信号指定槽函数.当信号触发时，就能够自动的执行到对应的槽函数

//事件
//用户进行的各种操作，也会产生事件.程序员同样可以给事件关联上处理函数(处理的逻辑)，当事件触发的时候，就能够执行到对应的代码

//事件本身是操作系统提供的机制.Qt也同样把操作系统事件机制进行了封装，拿到了Qt中.但是由于事件对应的代码编写起来不是很方便，
//Qt 对于事件机制又进行了进一步的封装，就得到了信号槽
//信号槽就是对于事件的进一步封装.事件是信号槽的底层机制.

//实际Qt开发程序过程中，绝大部分和用户之间进行的交互都是通过“信号槽”来完成的
//有些特殊情况下，信号槽不一定能搞定.(某个用户的动作行为，Qt没有提供对应的信号)
//此时就需要通过重写事件处理函数的形式，来手动处理事件的响应逻辑

//开放事件机制给咱们程序员，咱们就可以根据实际的需要
//进行更深度的定制化 diy 操作了

//我们之前的信号机制是让某一个信号和代码进行关联
//当信号触发的时候，就能指定到这段代码
//信号槽这里通过connect来完成上述关联的

//对于事件来说，还不太一样,不是上面的这种方式
//正确步骤是,让当前的类，重写某个事件处理函数
//这里用到的是“多态"机制
//创建子类,继承自 Qt 已有的类
//在子类中重写父类的事件处理函数
//后续事件触发过程中，就会通过多态这样的机制，执行到咱们自己写的子类的函数中

//重写写父类的函数，就需要确保你这边写的函数名字和函数的参数列表都完全一致（形参名无所谓）

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //鼠标移动不同于鼠标按下随便移动一下鼠标，就会产生出大量的鼠标移动事件.
    //当你进行捕获事件的时候，尤其是在这里再进行一些复杂逻辑的时候，程序负担就很重，很容易产生卡顿之类的情况Qt为了保证程序的流畅性
    //默认情况下不会对鼠标移动进行追踪.鼠标移动的时候不会调用mouseMoveEvent.除非显式告诉Qt就要追踪鼠标位置.
    //把这个选项设置为true，才能够追踪鼠标的移动位置
    this->setMouseTracking(true);

    //QMainWindow 包括菜单栏、工具栏、状态栏和中央部件等多个组件。如果你只为主窗口设置了鼠标追踪
    //而中央部件（通常是一个 QWidget 或其子类，用于放置大部分用户界面）或其他子部件没有独立启用鼠标追踪
    //那么鼠标在这些部件上的移动可能不会触发 mouseMoveEvent
    //所以我们这边需要获取到中间部件
    //然后进行鼠标追踪的设置
    QWidget* centralWidget = this->centralWidget();
    if (centralWidget) {
        centralWidget->setMouseTracking(true);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

//刚才重写鼠标事件的操作，都是在自定义的Label中完成的.此时鼠标只有在Label范围内进行动作的时候，才能捕获到
//也可以把这些操作直接放到Widget(QWidget子类）来完成．这样的话，鼠标在整个窗口中进行的各种动作都能获取到了
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << "当前鼠标横坐标: " << event->x() << "当前鼠标纵坐标: " << event->y();
}

void MainWindow::wheelEvent(QWheelEvent *event)
{
    //delta0获取到这次事件鼠标滚轮滚动了多远
    qDebug() << "当前鼠标滚动: " << event->delta();
}

